//
//  WBMainController.swift
//  SinaMicroblog
//
//  Created by 原鹏飞 on 2017/4/2.
//  Copyright © 2017年 YuanPengFei. All rights reserved.
//

import UIKit

/** extension的用法:
 1. 扩展类的功能, 例如便利构造器
 2. 实现代理
 3. 给代码分组, 让代码变得更易读
 */

/** 代码评审
 1. 作用是让代码更规范易读
 2. 在某些大公司, 代码评审每周都要做
 3. 主要内容:
    检查代码是否符合规范(命名, 代码风格, 注释等)
    检查当中的错误
    向同事解释比较复杂的代码的逻辑
 */

class WBMainController: UITabBarController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //设置UI
        setupUI()
    }
}


//MARK: - 点击事件
extension WBMainController {
    //在Swift中, 使用fileprivate或者private修饰事件时, 必须添加 @objc 修饰符
    @objc fileprivate func compose(button: UIButton) {
        print("发布微博")
    }
}


//MARK: - 设置UI
extension WBMainController {
    /// 设置UI
    fileprivate func setupUI() {
        self.view.backgroundColor = UIColor.white
        self.tabBar.tintColor = UIColor.orange
        
        //添加所有的子控制器
        addChildControllers()
        
        //添加tabBar底部的发布按钮
        setComposeButton()
        
        //设置tabBar的阴影线条
        setupShadowImage()
        
        //设置欢迎页/新特性页
        setWelcomeOrNewFeatureView()
    }
    
    /// 设置欢迎页/新特性页
    func setWelcomeOrNewFeatureView() {
        //获取新特性标识
        let isNewFeature = Bundle.main.isNewFeature
        
        //判断是否为登录状态
        if (WBUserAccount.shared.isLogin == true) {
            //判断是否有新特性
            if isNewFeature == true {
                //展示新特性页
                let newFeature = WBNewFeatureView()
                self.view.addSubview(newFeature)
            } else {
                //展示欢迎页
                let welcome = WBWelcomeView()
                self.view.addSubview(welcome)
            }
        }
    }
    
    
    //要设置tabBar的阴影线条, 必须同时设置下面两个属性
    func setupShadowImage() {
        //设置tabBar的背景图片
        tabBar.backgroundImage = UIImage(named: "tabbar_background")
        //设置tabBar的阴影图片
        tabBar.shadowImage = UIImage.pureImage(color: UIColor(white: 0.9, alpha: 0.9))
    }
    
    
    //创建发布按钮
    fileprivate func setComposeButton() {
        //使用便利构造器创建button
        let button = UIButton(title: nil, image: "tabbar_compose_icon_add", bgImage: "tabbar_compose_button", target: self, action: #selector(compose(button:)))
        
        //设置frame
        //indetBy 指以前面的frame为中心点, 向内或向外扩展
        let width = tabBar.frame.width/5
        button.frame = tabBar.bounds.insetBy(dx: width * 2 - 2, dy: 6)
        
        //将按钮添加到tabBar上
        tabBar.addSubview(button)
        
    }
    
    
    /// 调用generateChildController(dict:), 创建所有的子控制器
    fileprivate func addChildControllers() {
        //获取url
        if let url = Bundle.main.url(forResource: "main.json", withExtension: nil),
            //根据url, 获取data
            let jsonData = try? Data(contentsOf: url),
            //对data反序列化, 获取对象
            let object = try? JSONSerialization.jsonObject(with: jsonData, options: []),
            //根据对象创建参数字典数组
            let dicArr = object as? [[String: Any]]{
            //            print(dicArr)
            //定义保存控制器的空数组
            var controllers: [UINavigationController] = []
            //遍历参数字典数组
            for dic in dicArr {
                //创建子控制器
                let nav = generateChildController(dict: dic)
                controllers.append(nav!)
            }
            //            print(controllers)
            
            //设置所有的子控制器
            self.viewControllers = controllers
        }
    }
    
    
    /// 创建单个子控制器
    ///
    /// - Parameter dict: 参数字典数组
    /// - Returns: navVC导航控制器
     fileprivate func generateChildController(dict: [String: Any]) -> UINavigationController? {
        //通过字符串, 创建类, 并使用类来创建控制器
        if let clsName = dict["clsName"] {
            //类名在swift中, 必须加一个项目名的前缀
            let className = "SinaMicroblog" + "." + "\(clsName as! String)"
            //使用字符串来创建类, 注意必须转成 Type类型
            if let cls = NSClassFromString(className) as? WBRootController.Type {
                //使用类, 来创建一个子控制器对象
                let controller = cls.init()
                //设置子控制器的title
                let title = dict["title"] as? String
                controller.title = title
                //正常的文字颜色
                controller.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.gray], for: .normal)
                //选中的文字颜色
                controller.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.orange], for: .selected)
                //设置子控制器的图片
                if let imageName = dict["imageName"] {
                    //创建图片(拼接图片名)
                    let image = UIImage(named: "tabbar_\(imageName)")?.withRenderingMode(.alwaysOriginal)
                    //创建选中图片(拼接图片名)
                    let selectedImage = UIImage(named: "tabbar_\(imageName)_selected")?.withRenderingMode(.alwaysOriginal)
                    
                    controller.tabBarItem.image = image
                    controller.tabBarItem.selectedImage = selectedImage
                }
                
                //将访客视图的文本和图标属性赋值给controller
                controller.visitorDic = dict["visitorInfo"] as? [String: Any]
                
                //使用子控制器创建navigationController
                let nav = UINavigationController(rootViewController: controller)
                
                return nav
            }
        }
        return nil
    }
}
